/**
 * @file database.h
 * @brief Fichier d'entête du module database.
 *
 * @author Rachid Delory, Mamadou Keita, Florian Bernard
 */

#ifndef H_DATABASE_H
#define H_DATABASE_H


/* *********************************************************************

                       Librairies de database                           

********************************************************************* */

#include <stdlib.h>
#include <stdio.h>
#include <stddef.h>
#include <sqlite3.h>
#include <string.h>

struct sDataBase {
  sqlite3_stmt *stmt;
};

typedef struct sDataBase DataBase;

/**
 * @fn sqlite *ouvrir_Db() ;
 * @brief Ouvre une nouvelle base de donnée
 *
 * @return Un pointeur sur la base de donnée
 */
sqlite3 * ouvrir_Db();

/**
 * @fn void fermer_Db() ;
 * @brief Ferme la base de donnée
 */
void fermer_Db() ;

/**
 * @fn int step(const int i) ;
 * @brief Affiche à l'écran l'état de la base de donnée
 *
 * @param i Code de retour de sqlite
 * @return i
 */
int step(const int i);

/**
 * @fn int prepare_Db(DataBase *dataBase, const char *requete);
 * @brief
 *
 * @param[in,out] dataBase pointeur sur la base de donné
 * @return Le code erreur ou SQLITE_DONE ou SQLITE_OK
 */
int prepare_Db(DataBase *dataBase, const char *requete);

/**
 * @fn void bindValueInt_Db(DataBase *dataBase, const int nbCol, const int value);
 * @brief
 *
 * @param[in,out] dataBase pointeur sur la base de donné
 */
void bindValueInt_Db(DataBase *dataBase, const int nbCol, const int value);

/**
 * @fn void bindValueText_Db(DataBase *dataBase, const int nbCol, const char *value);
 * @brief
 *
 * @param[in,out] dataBase pointeur sur la base de donné
 */
void bindValueText_Db(DataBase *dataBase, const int nbCol, const char *value);

/**
 * @fn void execute_Db(DataBase *database);
 * @brief
 *
 * @param[in,out] dataBase pointeur sur la base de donné
 * @return 0 Si il n'y a plus de ligne à lire ou en cas d'erreur et 1 si il y a encore des lignes d'informations
 */
int execute_Db(DataBase *database);

/**
 * @fn void finalise_Db(DataBase *database);
 * @brief
 *
 * @param[in,out] dataBase pointeur sur la base de donné
 */
void finalise_Db(DataBase *database);

/**
 * @fn int getValueInt_Db(DataBase *dataBase, const int nbCol);
 * @brief
 *
 * @param[in,out] dataBase pointeur sur la base de donné
 */
int getValueInt_Db(DataBase *dataBase, const int nbCol);

/**
 * @fn const char *getValueText_Db(DataBase *dataBase, const int nbCol);
 * @brief
 *
 * @param[in,out] dataBase pointeur sur la base de donné
 */
const char *getValueText_Db(DataBase *dataBase, const int nbCol);

/**
 * @fn void regression_Db();
 * @brief
 *
 * @param[in,out] dataBase pointeur sur la base de donné
 */
void regression_Db();

#endif
